package spring.module.redis;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * 事务配置。事务模板单独创建，这是因为： RedisTemplete 开启了 Redis 事务支持后，
 * 在 @Transactional 中执行的 Redis 命令也会被认为是在 Redis 事务中执行的，要执行的递增命令会被放到队列中，
 * 不会立即返回执行后的结果，返回的是一个 null，需要等待事务提交时，队列中的命令才会顺序执行，
 * 最后 Redis 数据库的键值才会递增。
 * 
 *  
 * @author Lucky Yang
 */
@Configuration
public class TranscationConfig {
    private final RedisConnectionFactory redisConnectionFactory;

    public TranscationConfig(RedisConnectionFactory redisConnectionFactory) {
        this.redisConnectionFactory = redisConnectionFactory;
    }

    /**
     * 用于普通的命令，默认注入
     * @return
     */
    @Bean(name="stringRedisTemplate")
    @Primary
    public StringRedisTemplate stringRedisTemplate() {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    /**
     * 用于事务命令
     * @return
     */
    @Bean(name="stringRedisTemplateTranscation")
    public StringRedisTemplate stringRedisTemplateTranscation() {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        template.setEnableTransactionSupport(true);
        return template;
    }
}
